package com.sinosoft.dsp.persistence.businessconcept.utils;

import com.sinosoft.builder.templates.concept.CodeSet;
import com.sinosoft.builder.templates.concept.ComplexContentConceptType;
import com.sinosoft.builder.templates.concept.ContentConceptSet;
import com.sinosoft.builder.templates.concept.NamingElement;
import com.sinosoft.builder.templates.concept.NamingElementStatus;
import com.sinosoft.builder.templates.concept.SpecialClassificatory;

/**
 * 适用于业务概念XML的规范约束的工具类
 * 
 * @author 潘巍（PeterPan）
 * @since 2011-5-21 下午02:39:20
 * 
 */
public class BusinessConceptConstraintUtils {

	public static final String BC_ID_PREFIX = "id_";

	public static final String ELEMENT_NAMING_FLAG = ".n.";

	public static final String ELEMENT_REF_FLAG = ".r.";

	public static final String ELEMENT_REFSET_FLAG = ".rs.";

	public static final String CONTENT_PRIMITIVE_FLAG = ".p.";

	public static final String CONTENT_COMPLEX_FLAG = ".c.";

	public static final String CONTENT_SUB_FLAG = ".s.";

	public static final String CODESET_CODE_ID_FLAG = ".c.";

	public static final String CODESET_CODEVALUEOBJECT_ID_FLAG = ".v.";

	public static final String CODESET_CODEHIERARCHYTYPE_ID_FLAG = ".ht.";

	public static final String CODESET_CODEHIERARCHYSTRUCTURE_ID_FLAG = ".hs.";

	/**
	 * 设置命名元素
	 * 
	 * @param ne
	 * @param prefix
	 * @param index
	 */
	public static void setNamingElement(NamingElement ne, String prefix,
			int index) {
		if (index == 0) {
			ne.setStatus(NamingElementStatus.CREATION);
		} else {
			ne.setStatus(NamingElementStatus.AMENDMENT);
		}
		ne.setId(createNamingElmentId(prefix, index));
	}

	/**
	 * 通过给定业务概念的名称创建其ID
	 * 
	 * @param name
	 *            业务概念名称
	 * @return
	 */
	public static String createBusinessConceptId(String name) {
		return BC_ID_PREFIX + name;
	}

	/**
	 * 创建命名元素ID
	 * 
	 * @param prefix
	 * @param index
	 * @return
	 */
	public static String createNamingElmentId(String prefix, int index) {
		return prefix + ELEMENT_NAMING_FLAG + index;
	}

	/**
	 * 创建引用的ID
	 * 
	 * @param prefix
	 * @param index
	 * @return
	 */
	public static String createRefId(String prefix, int index) {
		return prefix + ELEMENT_REF_FLAG + index;
	}

	/**
	 * 创建简单内容概念ID
	 * 
	 * @param prefix
	 * @param ccs
	 * @return
	 */
	public static String createNewPrimitiveContentConceptId(String prefix,
			ContentConceptSet ccs) {
		return prefix + CONTENT_PRIMITIVE_FLAG
				+ ccs.getPrimitiveContentConcept().size();
	}

	/**
	 * 创建复合内容概念ID
	 * 
	 * @param prefix
	 * @param ccs
	 * @return
	 */
	public static String createNewComplexContentConceptId(String prefix,
			ContentConceptSet ccs) {
		return prefix + CONTENT_COMPLEX_FLAG
				+ ccs.getComplexContentConcept().size();
	}

	/**
	 * 创建子内容概念组ID
	 * 
	 * @param ccct
	 * @return
	 */
	public static String createNewSubContentConceptGroupId(
			ComplexContentConceptType ccct) {
		return ccct.getId() + CONTENT_SUB_FLAG
				+ ccct.getSubContentConceptGroup().size();
	}

	/**
	 * 通过代码集创建一个新的代码ID<br>
	 * 规则：[CodeSet的id].c.[序号]
	 * 
	 * @param cs
	 *            代码集
	 * @return
	 */
	public static String createNewCodeSetCodeId(CodeSet cs) {
		if (cs != null) {
			return cs.getId() + CODESET_CODE_ID_FLAG + cs.getCode().size();
		}
		return null;
	}

	/**
	 * 通过代码集创建一个新的代码值对象ID<br>
	 * 规则：[CodeSet的id].v.[序号]
	 * 
	 * @param cs
	 *            代码集
	 * @return
	 */
	public static String createNewCodeSetCodeValueObjectId(CodeSet cs) {
		if (cs != null) {
			return cs.getId() + CODESET_CODEVALUEOBJECT_ID_FLAG
					+ cs.getCodeValueObject().size();
		}
		return null;
	}

	/**
	 * 通过代码集创建一个新的代码类型ID<br>
	 * 规则：[CodeSet的id].ht.[序号]
	 * 
	 * @param cs
	 *            代码集
	 * @return
	 */
	public static String createNewCodeSetCodeHierarchyTypeId(CodeSet cs) {
		if (cs != null) {
			return cs.getId() + CODESET_CODEHIERARCHYTYPE_ID_FLAG
					+ cs.getCodeHieerarchyType().size();
		}
		return null;
	}

	/**
	 * 通过代码集创建一个新的代码层级ID<br>
	 * 规则：[CodeSet的id].hs.[序号]
	 * 
	 * @param cs
	 *            代码集
	 * @return
	 */
	public static String createNewCodeSetCodeHierarchyStructureId(CodeSet cs) {
		if (cs != null) {
			return cs.getId() + CODESET_CODEHIERARCHYSTRUCTURE_ID_FLAG
					+ cs.getCodeHierarchyStructure().size();
		}
		return null;
	}

	/**
	 * 通过特殊划分集创建一个新的代码层级ID<br>
	 * 规则：[CodeSet的id].hs.[序号]
	 * 
	 * @param cs
	 *            代码集
	 * @return
	 */
	public static String createNewCodeSetSpecialClassificatoryCodeHierarchyStructureId(
			SpecialClassificatory sc) {
		if (sc != null) {
			return sc.getId() + CODESET_CODEHIERARCHYSTRUCTURE_ID_FLAG
					+ sc.getCodeHierarchyStructure().size();
		}
		return null;
	}
}
